/**
 * TypeScript 中为非常多的内置对象都预留了泛型坑位，
*/
//1、在 Promise 中，在填充 Promise 的泛型以后，其内部的 resolve 方法也自动填充了泛型
function p() {
    return new Promise<boolean>((resolve, reject) => {
        resolve(true);
    });
}
//2、在数组 Array<T> 当中，其泛型参数代表数组的元素类型，几乎贯穿所有的数组方法：
const arr: Array<number> = [1, 2, 3];
arr.push('hanxuming');
arr.includes('hanxuming');
/**
 * 数组 find 的方法：
*/
// number | undefined
arr.find(() => false);

/**
 * 数组 reduce 的方法，reduce 方法是相对特殊的一个，它的类型声明存在几种不同的重载：
 * 
 * 当不传入初始值时，泛型参数 会从 数组的元素类型 中进行填充。
 * 当传入初始值时，如果 初始值的类型 与 数组元素类型 一致，则使用 数组的元素类型 进行填充。
 * 比如第一种 reduce 调用。
 * 
 * 当传入一个数组类型的初始值，reduce 的泛型参数会默认从这个初始值推导出的类型进行填充，如这里是 never[]。
 * 比如第二种 reduce 调用，
 * 
 * 第三种情况是 信息不足，无法推导出正确的类型，可以 手动传入泛型参数 来解决：
*/
// 第一种 reduce
arr.reduce((prev, curr, idx, arr) => {
    return prev;
}, 1);

// 第二种 reduce
// 报错：不能将 number 类型的值赋值给 never 类型
arr.reduce((prev, curr, idx, arr) => {
    return [...prev, curr]
}, []);

// 第三种 reduce
arr.reduce<number[]>((prev, curr, idx, arr) => {
    return prev;
}, []);

//export {}：解决“无法重新声明块范围变量”错误提示问题
export { }